﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataLayer.dbml;
using System.Xml.Linq;
using System.Xml;
using System.Data;
using System.Data.Linq.SqlClient;
using DataLayer.Utilities;


namespace DataLayer.Controller
{
    /// <summary>
    /// Clase responsable del manejo de las OT
    /// </summary>
    public class OTController : GenericController<ORDEN_TRABAJO, DataClassesDataContext>
    {

        /// <summary>
        /// Retorna datatable con todas las ots existentes
        /// </summary>
        /// <returns></returns>
        public static DataTable GetAll()
        {
            var q = from o in DataContext.ORDEN_TRABAJO
                    select o;

            return ConvertData.ToDataTable(q);
        }

        public static DataTable GetAllbyProveedor(string idProveedor)
        {
            var q = from o in DataContext.ORDEN_TRABAJO
                    where o.ID_PROVEEDOR_SDFC == idProveedor
                    select o;

            return ConvertData.ToDataTable(q);        
        }


        /// <summary>
        /// OT por ID
        /// </summary>
        /// <param name="idSDFC"></param>
        /// <returns></returns>
        public static ORDEN_TRABAJO GetByIdSDFC(string idSDFC)
        {
            return (from r in DataContext.ORDEN_TRABAJO
                    where r.ID_OT_SDFC == idSDFC
                    select r).FirstOrDefault<ORDEN_TRABAJO>();
        }

        /// <summary>
        /// Cambia el estado de la factura.
        /// </summary>
        /// <param name="idSDFC"></param>
        /// <param name="status"></param>
        public static void SetStatus(string idSDFC, string status)
        {
            ORDEN_TRABAJO OT = (from r in DataContext.ORDEN_TRABAJO
                            where r.ID_OT_SDFC == idSDFC
                            select r).SingleOrDefault();
            OT.ESTADO = status;
            DataContext.SubmitChanges();
        }

        /// <summary>
        /// Cierra una OT
        /// </summary>
        /// <param name="idSDFC"></param>
        /// <param name="comentarios"></param>
        public static void CloseOT(string idSDFC, string comentarios)
        {
            ORDEN_TRABAJO OT = (from r in DataContext.ORDEN_TRABAJO
                                where r.ID_OT_SDFC == idSDFC
                                select r).SingleOrDefault();
            OT.ESTADO = "Cerrado";
            OT.COMENTARIO = comentarios;
            OT.FECHA_CIERRE = DateTime.Now;
            DataContext.SubmitChanges();
        }

        /// <summary>
        /// OT por ID
        /// </summary>
        /// <param name="idSDFC"></param>
        /// <returns></returns>
        public static string Insert(string tipoRegistroSF, string codigoOrden, string idOT, string proveedor, string estado, string version, DateTime fecha, string CPA, string servicio, string idServicio, bool facturable, string razonSocial, string tipoCliente, string telefono, string direccion, string ciudad, string sede, string contacto, string celular, string observaciones, string caso, string trabajos, string tecnologia)
        {

            string statusWS =  PropertiesApp.StatusWS.Exitosa.ToString();
            string statusObservation = string.Empty;

            try
            {
                ORDEN_TRABAJO OT = new ORDEN_TRABAJO() { TIPO_OT = tipoRegistroSF, CODIGO_ORDEN = codigoOrden, ID_OT_SDFC = idOT, ID_PROVEEDOR_SDFC = proveedor, ESTADO = estado, VERSION = version, FECHA = fecha, CPA = CPA, NOMBRE_SERVICIO = servicio, ID_SERVICIO = idServicio, FACTURABLE = facturable, RAZON_SOCIAL = razonSocial, TIPO_CLIENTE = tipoCliente, TELEFONO = telefono, DIRECCION = direccion, CIUDAD = ciudad, SEDE = sede, CONTACTO = contacto, CELULAR = celular, OBSERVACIONES = observaciones, CASO = caso, TRABAJOS = trabajos, TECNOLOGIA = tecnologia };
                Insert(OT);
            }
            catch (Exception EX)
            {
                statusWS = PropertiesApp.StatusWS.Fallida.ToString();
                statusObservation = "No se pudo insertar el objeto Orden Trabajo, revise los parametros.";
                LogErrorController.Insert(PropertiesApp.Error.OTController, EX.ToString());
            }


            XElement xmlData = new XElement("result");

            xmlData.Add(new XElement("TipoTransaccion","CREACION-OT"),
                    new XElement("ElementoEnviado", new XElement("tipoRegistroSF", tipoRegistroSF),
                                                 new XElement("codigoOrden",codigoOrden ),
                                                 new XElement("idOT", idOT),
                                                 new XElement("proveedor", proveedor),
                                                 new XElement("estado", estado),
                                                 new XElement("version", version),
                                                 new XElement("fecha", fecha.ToString("dd/MM/yyyy")),
                                                 new XElement("CPA", CPA),
                                                 new XElement("servicio", servicio),
                                                 new XElement("idServicio", idServicio),
                                                 new XElement("facturable", facturable),
                                                 new XElement("razonSocial", razonSocial),
                                                 new XElement("tipoCliente", tipoCliente),
                                                 new XElement("telefono", telefono),
                                                 new XElement("direccion", direccion),
                                                 new XElement("ciudad", ciudad),
                                                 new XElement("sede", sede),
                                                 new XElement("contacto", contacto),
                                                 new XElement("celular", celular),
                                                 new XElement("observaciones", observaciones),
                                                 new XElement("caso", caso),
                                                 new XElement("trabajos", trabajos),
                                                 new XElement("tecnologia", tecnologia)),
                    new XElement("EstadoTransaccion", statusWS),
                    new XElement("Observaciones", statusObservation),
                    new XElement("FechaTransaccion", DateTime.Now.ToString())
               );

   
               return xmlData.ToString();
           
        }
    }
}
